home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / PNL Libraries / MyStandardGetFolder.p < prev    next >
Encoding:
Text File  |  1995-06-09  |  4.3 KB  |  137 lines  |  [TEXT/CWIE]

  1. unit MyStandardGetFolder;
  2.  
  3. interface
  4.  
  5.     uses
  6.         StandardFile;
  7.  
  8.     procedure StandardGetFolder (where: Point; message: Str255; var mySFReply: StandardFileReply);
  9. {     Upon return, the sfFile field of the SFReply record contains the volume  }
  10. {     reference number and directory ID that specify the folder the user       }
  11. {     chose. It also passes back the name of the chosen folder.  The sfGood    }
  12. {     field is set to true if the user chose a folder, or false if not.        }
  13.  
  14. implementation
  15.  
  16.     uses
  17.         TextUtils, Aliases, Script, MyStrings, MyFileSystemUtils, MyDialogs;
  18.  
  19.     const
  20.         rGetFolderButton = 10;
  21.         rGetFolderMessage = 11;
  22.         rGetFolderSelectString = 12;
  23.         kFolderBit = $0010;
  24.         rGetFolderDialog = 2008;
  25.  
  26.     type
  27.         StandardFileReplyPtr = ^StandardFileReply;
  28.  
  29.     var
  30.         gCurrentSelectedFolder: str255;
  31.  
  32.     function MyCustomGetDirectoryFileFilter (var myPB: CInfoPBRec; ignored: Ptr): boolean;
  33.     begin
  34.         ignored := ignored; { UNUSED! }
  35.         MyCustomGetDirectoryFileFilter := BAND(myPB.ioFlAttrib, kFolderBit) = 0;
  36.     end;
  37.  
  38.     function MyCustomGetDirectoryDlogHook (item: integer; theDialog: DialogPtr; mySFRPtr: StandardFileReplyPtr): integer;
  39.  
  40.         procedure SetButtonTitle (name: Str255);
  41.             var
  42.                 resultCode: integer;
  43.                 width: integer;
  44.                 template, s: str255;
  45.                 itemRect: rect;
  46.         begin
  47.             if gCurrentSelectedFolder <> name then begin
  48.                 gCurrentSelectedFolder := name;
  49.                 GetItemText(theDialog, rGetFolderSelectString, template); { "Select “^1”" template }
  50.                 GetDItemRect(theDialog, rGetFolderButton, itemRect);
  51.                 SPrintS3 (s,template,'','','');
  52.                 width := (itemRect.right - itemRect.left) - StringWidth(s);
  53.                 resultCode := TruncString(width, name, smTruncEnd);
  54.                 SPrintS3 (s,template,name,'','');
  55.                 SetDCtlTitle(theDialog, rGetFolderButton, s);
  56.                 ValidRect(itemRect);
  57.             end;
  58.         end;
  59.  
  60.         procedure SetFolderButtonTitle (vrn: integer; dirID: longInt);
  61.             var
  62.                 name: str63;
  63.                 pb: CInfoPBRec;
  64.                 oe: OSErr;
  65.         begin
  66.             oe := MyGetCatInfo(vrn, dirID, name, -1, pb);
  67.             if oe = noErr then begin
  68.                 SetButtonTitle(name);
  69.             end;
  70.         end;
  71.  
  72.         var
  73.             wrefcon:longInt;
  74.     begin
  75.         wrefcon:=GetWRefCon(theDialog);
  76.         if OSType(wrefcon) = sfMainDialogRefCon then begin
  77.             if item = sfHookFirstCall then begin
  78.                 SetItemText(theDialog, rGetFolderMessage, gCurrentSelectedFolder);
  79.                 gCurrentSelectedFolder := '';
  80.             end else begin
  81.                 if mySFRPtr^.sfFile.name = '' then begin
  82.                     GetSFLocation(mySFRPtr^.sfFile.vRefNum, mySFRPtr^.sfFile.parID); { these aren't always set properly }
  83.                     SetFolderButtonTitle(mySFRPtr^.sfFile.vRefNum, mySFRPtr^.sfFile.parID);
  84.                 end
  85.                 else begin
  86.                     SetButtonTitle(mySFRPtr^.sfFile.name);
  87.                 end;
  88.             end;
  89.  
  90.             if item = rGetFolderButton then begin
  91.                 item := sfItemCancelButton;
  92.                 mySFRPtr^.sfGood := true;
  93.             end;
  94.  
  95.         end;
  96.         MyCustomGetDirectoryDlogHook := item;
  97.     end;
  98.  
  99.     procedure StandardGetFolder (where: Point; message: Str255; var mySFReply: StandardFileReply);
  100.         var
  101.             theTypeList: SFTypeList;
  102.             pb: CInfoPBRec;
  103.             isfolder, wasaliased: boolean;
  104.             oe: OSErr;
  105.     begin
  106.         gCurrentSelectedFolder := message;
  107.  
  108.         CustomGetFile(@MyCustomGetDirectoryFileFilter, -1, @theTypeList, mySFReply, rGetFolderDialog, where, @MyCustomGetDirectoryDlogHook, nil, nil, nil, @mySFReply);
  109.  
  110.     {*-------------------------------------------------------------------------}
  111.     { Ok, now the reply record contains the volume reference number and the    }
  112.     { name of the selected folder. We need to use PBGetCatInfo to get the      }
  113.     { directory ID of the selected folder.                                     }
  114.     {-------------------------------------------------------------------------*}
  115.         if mySFReply.sfGood then begin { Don't call PBGetCatInfo on cancel! }
  116.  
  117.             if mySFReply.sfFile.name <> '' then begin { get the dirID of the selected folder }
  118.                 oe := ResolveAliasFile(mySFReply.sfFile, true, isfolder, wasaliased);
  119.                 if (oe = noErr) & not isfolder then begin
  120.                     oe := -1;
  121.                 end;
  122.                 if oe = noErr then begin
  123.                     oe := MyGetCatInfo (mySFReply.sfFile.vRefNum, mySFReply.sfFile.parID, mySFReply.sfFile.name, 0, pb);
  124.                 end;
  125.                 mySFReply.sfGood := oe = noErr;
  126.  
  127.                 mySFReply.sfFile.parID := pb.ioDrDirID;
  128.                 mySFReply.sfFile.name := '';
  129.             end;
  130.             if oe = noErr then begin { get the name of the selected folder }
  131.                 oe := MyGetCatInfo (mySFReply.sfFile.vRefNum, mySFReply.sfFile.parID, mySFReply.sfFile.name, -1, pb);
  132.             end;
  133.         end;
  134.  
  135.     end;
  136.  
  137. end.